package org.skywork.bll.process.search.basic;

// *************************************************************************/
// Charada Soft
// Area de Desarrollo de Sistemas de Información
// *************************************************************************/
// Proyecto : SkyWork Bussiness Logic Layer
// Archivo : BuscarArrendatario.java
// Descripcion : Clase BuscarArrendatario
// *************************************************************************/
// Version : 2.11.8
// Fecha de Creación: 04 de Enero de 2015
// Author : Daniel Andres Castillo Pedroza
// *************************************************************************/

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import org.skywork.bll.process.Format;
import org.skywork.bll.system.MessageControl;
import org.skywork.bll.process.SkyWorkControllerSQL;
import org.skywork.dal.basic.ArrendatarioDAO;
import org.skywork.dal.basic.EmpresaDAO;
import org.skywork.dal.basic.PersonaDAO;
import org.skywork.dal.system.SystemDAO;
import org.skywork.entitys.basic.Arrendatario;
import org.skywork.entitys.basic.Empresa;
import org.skywork.entitys.basic.Persona;
import org.sql.commands.exception.DMLException;
import org.tools.Result;

public class BuscarArrendatario extends SkyWorkControllerSQL {
    
    // Atributos estáticos de la clase BuscarArrendatario
    
    public static final String BUSCAR_POR_IDENTIFICACION = "IDENTIFICACION";
    public static final String BUSCAR_POR_APELLIDOS = "APELLIDOS DE PERSONA";
    public static final String BUSCAR_POR_NOMBRE_EMPRESA = "NOMBRE DE EMPRESA";
    
    // Atributos de la clase BuscarArrendatario
    
    private final String tipoBusqueda;
    private String parametro;
    
    // Constructor de la clase BuscarArrendatario
    
    private BuscarArrendatario(String tipoBusqueda, String parametro) {
        this.tipoBusqueda = tipoBusqueda; setParametro(parametro);
    }
    
    // Métodos de la clase BuscarArrendatario
    
    private void setParametro(String parametro) {
        this.parametro = parametro;
    }
    
    private void buscarArrendatarioPorIdentificacion() throws SQLException, DMLException {
        Arrendatario arrendatario = ArrendatarioDAO.buscarPorIdentificacion(parametro);
        
        if (arrendatario != null) {
            if (arrendatario.getEntidad() instanceof  Persona) {
                Persona persona = (Persona) arrendatario.getEntidad();
                
                // Buscando datos de la Persona en el Sistema
                Persona personaDatos = PersonaDAO.buscarPorCedula(parametro);
                persona.setDatos(personaDatos.getDatos());
            } // La entidad es una Persona
            
            else {
                Empresa empresa = (Empresa) arrendatario.getEntidad();
                
                // Buscando datos de la Persona en el Sistema
                Empresa empresaDatos = EmpresaDAO.buscarPorNIT(parametro);
                empresa.setDatos(empresaDatos.getDatos());
            } // La entidad es una Empresa
            
            result.setObject(arrendatario); // Asignando el Arrendatario
        } // Se ha encontrado Arrendatario en el Sistema 
        
        else {
            result.setSuccess(false);
        } // No se ha encontrado Arrendatario en el Sistema 
    }
    
    private void buscarArrendatariosPorApellidos() throws SQLException, DMLException {
        ArrayList <Arrendatario> arrendatarios = ArrendatarioDAO.buscarPorApellidos(parametro + "%");
        
        if (!arrendatarios.isEmpty()) {
            for (Arrendatario arrendatario : arrendatarios) {
                Persona persona = (Persona) arrendatario.getEntidad();
                
                // Buscando datos de la Persona en el Sistema
                Persona personaDatos = PersonaDAO.buscarPorCedula(persona.getIdentificacion());
                persona.setDatos(personaDatos.getDatos());
            } // Cargando los datos de la entidad de los Arrendatarios
            
            result.setObject(arrendatarios); // Asignando el Arrendatario
        } // Se han encontrado Arrendatarios en el Sistema 
        
        else {
            result.setSuccess(false);
        } // No se han encontrado Arrendatarios en el Sistema 
    }
    
    private void buscarArrendatariosPorNombreDeEmpresa() throws SQLException, DMLException {
        ArrayList <Arrendatario> arrendatarios = ArrendatarioDAO.buscarPorNombreDeEmpresa(parametro + "%");
        
        if (!arrendatarios.isEmpty()) {
            for (Arrendatario arrendatario : arrendatarios) {
                Empresa empresa = (Empresa) arrendatario.getEntidad();
                
                // Buscando datos de la Persona en el Sistema
                Empresa empresaDatos = EmpresaDAO.buscarPorNIT(empresa.getIdentificacion());
                empresa.setDatos(empresaDatos.getDatos());
            } // Cargando los datos de la entidad de los Arrendatarios
            
            result.setObject(arrendatarios); // Asignando el Arrendatario
        } // Se han encontrado Arrendatarios en el Sistema 
        
        else {
            result.setSuccess(false);
        } // No se han encontrado Arrendatarios en el Sistema 
    }
    
    /**
     * Este método nos permite crear y configurar un objeto para realizar la 
     * busqueda de arrendatarios del Sistema. Donde el tipo de busqueda y el parámetro 
     * de esta se establecen con objetos <code>String</code>.
     * 
     * @param tipoBusqueda Tipo de Busqueda en el Sistema
     * @param parametro Parámetro de busqueda en la Aplicación
     * @return Retorna el buscador en un objeto <code>BuscarArrendatario</code>.
     */
    public static BuscarArrendatario getInstance(String tipoBusqueda, String parametro) {
        return new BuscarArrendatario(tipoBusqueda,parametro);
    }
    
    // Métodos sobreescritos de la clase BuscarArrendatario

    @Override
    public Result validate() {
        // Instanciando objeto para Respuesta
        result = new Result(); result.setCode(Result.WARNING);
        parametro = Format.setTextFormat(parametro); // Formato al Texto
        
        switch (tipoBusqueda) {
            case (BUSCAR_POR_IDENTIFICACION) :
                result.setMessage(MessageControl.get(MessageControl.IDENTIFICACION_NO_ESTABLECIDA));
            break;
                
            case (BUSCAR_POR_APELLIDOS) :
                result.setMessage(MessageControl.get(MessageControl.APELLIDOS_NO_ESTABLECIDO));
            break;
                
            case (BUSCAR_POR_NOMBRE_EMPRESA) :
                result.setMessage(MessageControl.get(MessageControl.NOMBRE_EMPRESA_NO_ESTABLECIDO));
            break;
        } // Estableciendo el tipo de Mensaje a Mostrar
        
        if (parametro.length() > 0) {
            result.setSuccess(true);
        } // Se ha establecido un número de Identifiación correcto
        
        return result; // Retornando el objeto de Respuesta
    }

    @Override
    public Result configurateData() {
        result.setMessage(MessageControl.get(MessageControl.ARRENDATARIOS_NO_EXISTE));
        return result; // Retornando el objeto de Respuesta
    }

    @Override
    public Result process(Connection connection) throws SQLException, DMLException {
        SystemDAO.getInstance().setConnection(connection);
        
        switch(tipoBusqueda) {
            // Buscando Arrendatarios por Identificación
            case (BUSCAR_POR_IDENTIFICACION) :
                buscarArrendatarioPorIdentificacion();
            break;
                
            // Buscando Arrendatarios por Apellidos (Solo Ppersonas)
            case (BUSCAR_POR_APELLIDOS) :
                buscarArrendatariosPorApellidos();
            break;
                
            // Buscando Arrendatarios por Apellidos (Solo Ppersonas)
            case (BUSCAR_POR_NOMBRE_EMPRESA) :
                buscarArrendatariosPorNombreDeEmpresa();
            break;
        } // Definiendo el tipo de Busqueda en el Sistema
        
        return result; // Retornando el objeto de Respuesta
    }

    @Override
    public Result processSQLException(SQLException ex) {
        result.setMessage("No se pudo realizar busqueda: " + ex.getMessage()); 
        result.setSuccess(false); return result; // Retornando resultado
    }    
}